/**
 * @file update.js
 * @description LY Werewolf Plugin - Auto Update
 */

import plugin from '../../../lib/plugins/plugin.js';

export class Update extends plugin {
  constructor() {
    super({
      name: 'LY-Update',
      dsc: 'Auto update plugin',
      event: 'message',
      priority: 100,
      rule: [
        {
          reg: '^#?LY更新$',
          fnc: 'updatePlugin'
        }
      ]
    });
  }

  /**
   * 更新插件并重启 Yunzai
   * @param {object} e - 消息事件对象。
   * @returns {Promise<boolean>} 是否成功处理。
   */
  async updatePlugin(e) {
    // 检查权限（只允许主人和管理员执行）
    if (!e.isMaster && !e.member?.is_admin) {
      await e.reply('❌ 只有主人或管理员才能执行更新操作', true);
      return true;
    }

    await e.reply(' 开始更新 LY 狼人杀插件...', true);

    try {
      const { exec } = await import('child_process');
      const { promisify } = await import('util');
      const execAsync = promisify(exec);

      // 获取插件目录路径
      const pluginPath = process.cwd() + '/plugins/LY-Plugin';

      // 执行 git pull
      await e.reply('正在从 Gitee 拉取最新代码...', true);

      try {
        const { stdout, stderr } = await execAsync('git pull', {
          cwd: pluginPath,
          timeout: 60000 // 60秒超时
        });

        console.log('[LY-Plugin] Git pull output:', stdout);

        if (stderr && !stderr.includes('Already up to date')) {
          console.error('[LY-Plugin] Git pull stderr:', stderr);
        }

        // 检查是否已是最新
        if (stdout.includes('Already up to date') || stdout.includes('已经是最新')) {
          await e.reply('✅ 插件已是最新版本，无需更新', true);
          return true;
        }

        // 显示更新内容
        const updateInfo = stdout.trim();
        await e.reply(`✅ 更新成功！\n\n${updateInfo}\n\n🔄 即将重启 Yunzai...`, true);

        // 延迟3秒后重启，给用户看到消息的时间
        setTimeout(async () => {
          try {
            console.log('[LY-Plugin] 开始重启 Yunzai...');

            // 尝试多种重启方式
            await execAsync('pnpm run restart').catch(() => {
              return execAsync('npm run restart').catch(() => {
                return execAsync('pm2 restart index.js').catch(() => {
                  // 如果都失败，直接退出进程让 pm2 自动重启
                  console.log('[LY-Plugin] 使用进程退出方式重启');
                  process.exit(0);
                });
              });
            });
          } catch (err) {
            console.error('[LY-Plugin] 重启失败，尝试进程退出:', err);
            process.exit(0);
          }
        }, 3000);

        return true;

      } catch (gitErr) {
        console.error('[LY-Plugin] Git pull 失败:', gitErr);

        let errorMsg = '❌ 拉取代码失败\n\n';
        errorMsg += `错误信息：${gitErr.message}\n\n`;
        errorMsg += '请检查：\n';
        errorMsg += '1. Git 是否已安装\n';
        errorMsg += '2. 网络连接是否正常\n';
        errorMsg += '3. 是否有未提交的本地修改\n';
        errorMsg += '4. Gitee 仓库地址是否正确\n\n';
        errorMsg += '💡 提示：可以手动执行 git pull 查看详细错误';

        await e.reply(errorMsg, true);
        return true;
      }

    } catch (err) {
      console.error('[LY-Plugin] 更新插件失败:', err);
      await e.reply(`❌ 更新失败：${err.message}`, true);
      return true;
    }
  }
}

